# -*- coding: utf-8 -*-
import pdb
import os
import time
import ccxt
import sys
import argparse
from Config import *
from alphalib.product.exchange_config import exchange_basic_config, get_exchange_by_account

parser = argparse.ArgumentParser(description="Z1框架实盘")
parser.add_argument('--debug', action='store_true', help='调试模式')
parser.add_argument('--account', type=str, required=True, help='实盘账户，参考secret/example.py配置')

args = parser.parse_args()

_ = os.path.abspath(os.path.dirname(__file__))  # 返回当前文件路径
root_path = os.path.abspath(os.path.join(_, '..'))  # 返回根目录文件夹

# 获取目录位置，不存在就创建目录
data_path = os.path.join(root_path, 'data')
if not os.path.exists(data_path):
    os.makedirs(data_path)

# 获取目录位置，不存在就创建目录
data_center_path = os.path.join(root_path, 'data', 'data_center')
if not os.path.exists(data_center_path):
    os.makedirs(data_center_path)

# 获取目录位置，不存在就创建目录
flag_path = os.path.join(root_path, 'data', 'flag')
if not os.path.exists(flag_path):
    os.makedirs(flag_path)

# 获取目录位置，不存在就创建目录
order_path = os.path.join(root_path, 'data', 'order')
if not os.path.exists(order_path):
    os.makedirs(order_path)


# =====debug模式。模拟运行程序，不会去下单
is_debug = args.debug

# =====每次请求接口获取的k线数量(如果k线不足，计算得出的因子值会与实盘对应不上)
get_kline_num = 999

# =====最小k线数量限制，k线数量太少的币种，不参与交易
min_kline_size = 72  # 如果是日线持仓，则少于7天数据不参与交易，如果是小时持仓，则少于7小时的币种不参与交易，根据情况自行修改

# =====拆单最大金额
max_one_order_amount = 200

# =====拆单后的下单间隔(单位: 秒)
twap_interval = 2

# =====获取当前服务器时区，距离UTC 0点的偏差
utc_offset = int(time.localtime().tm_gmtoff / 60 / 60)  # 如果服务器在上海，那么utc_offset=8

# =====读取数据的核心数。根据自身服务器情况调整
njob = n_jobs #min(max(os.cpu_count() - 2, 1),59) #os.cpu_count() # 1, -1都是串行。0 无效会报错。2及以上使用多进程。

# =====现货稳定币名单，不参与交易的币种
stable_symbol = ['BKRW', 'USDC', 'USDP', 'TUSD', 'BUSD', 'FDUSD', 'DAI', 'EUR', 'GBP', 'USBP', 'SUSD', 'PAXG', 'AEUR']

# =====特殊现货对应列表
special_symbol_dict = {
    'DODO': 'DODOX',  # DODO现货对应DODOX合约
    'LUNA': 'LUNA2',  # LUNA现货对应LUNA2合约
    '1000SATS': '1000SATS',  # 1000SATS现货对应1000SATS合约
}

# 现货下单最小金额限制，适当增加可以减少部分reb。默认10，不建议小于10，这会让你的下单报错，10是交易所的限制。
order_spot_money_limit = 10
# 合约下单最小金额限制，适当增加可以减少部分reb。默认5，不建议小于5，这会让你的下单报错，5是交易所的限制。
order_swap_money_limit = 5

# 保温杯是滚仓模式，f1动量是非滚仓模式
auto_reb = True

# =====本地电脑与服务器的时差
class GlobalVariable:
    diff_timestamp = 0
    def update_diff_time(self, _t):
        self.diff_timestamp = _t
# 存储这个全局变量
glob_var = GlobalVariable()

# ======账户信息
default_account_config = {
    # 全局配置改成账户策略配置
    "if_use_bnb_burn": True,  # 是否开启BNB燃烧，抵扣手续费
    "buy_bnb_value": 11,  # 买多少U的bnb来抵扣手续费。建议最低11U，现货最小下单量限制10U
    "if_transfer_bnb": False,  # 是否开启小额资产兑换BNB功能。仅现货模式下生效
    "has_spot_strategy": True, # 是否使用现货
    "has_swap_strategy": True, # 是否使用合约
    "leverage": 1.0,  # 杠杆。现货模式下：最大杠杆限制1.3倍。合约模式不做限制。
    # 获取多少根K线。这里跟策略日频和小时频影响。日线策略，代表999根日线k。小时策略，代表999根小时k
    "get_kline_num": get_kline_num,
    "min_kline_size": min_kline_size,  # 最低要求b中有多少小时的k线。这里与回测一致。168：表示168小时
    "max_one_order_amount": max_one_order_amount,  # 最大拆单金额。
    "twap_interval": twap_interval,  # 下单间隔
    "hour_offset": '0m',  # 分钟偏移设置，可以自由设置时间，配置必须是kline脚本中interval的倍数。默认：0m，表示不偏移。15m，表示每个小时偏移15m下单。
    # 创建企业微信机器人 参考帖子: https://bbs.quantclass.cn/thread/10975
    # 配置案例  https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=95b16b88-401c-48d0-9381-2cf829b1e990xxxxxxxxxxxxxxxxxxx
    "wechat_webhook_url": 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='
}

accounts_str = args.account
account_list = [item.strip() for item in accounts_str.split(',')]

account_config = {}
for account_name in account_list:
    exchange_config = {
        **exchange_basic_config,
    }
    exchange_config.update(
        get_exchange_by_account(account_name)
    )
    account_config[account_name] = {
        **default_account_config,
        'exchange': ccxt.binance(exchange_config),
        # 采用Z1回测配置
        "strategy_name": 'ExampleILLQ',
    }

